#include <malloc.h>
#include <time.h>
#include<stdio.h>
#include<stdlib.h>

/**** petite macro pour choisir le type des matrices et vecteurs (entiers, reels) ******/
// gcc -DTYPE_INT
#ifdef INT
typedef int T;
#else
#ifdef FLOAT
typedef float T;
#else
 #error "Need to give MACRO definition for element type : -DINT or -DFLOAT"
#endif
#endif
/***************************************************************************************/


#include "fonctions.c"



/*********** programme principal********************************/ 

int main(int argc, char *argv[])
{


	//declarations parametres
	// on precisera la taille des matrices en ligne de commande
	int dim1=atoi(argv[1]);
	int dim2=atoi(argv[2]);
	int f_compteur=atoi(argv[3]);
	int i,j,t=0;
	
	int valeurmax,valeurmin;
	
	T **A;
	T* u;
	T* v;

	//pour le stockage de matrice dense 2D
	//allocation dynamique en memoire de A, u et du vecteur resultat
	A =(T**) malloc(dim1*sizeof(*A));
	v=(T*)malloc(dim1*sizeof(T));
	u=(T*)malloc(dim2*sizeof(T));

	valeurmax=100000;
	valeurmin=-100000;

	// les coefficients de A sont aleatoires
	for(i=0;i<dim1;i++)
	{
		A[i]=(T*)malloc(dim2*sizeof(**A));
		for(j=0;j<dim2;j++)
		{
			A[i][j]=(T)rand()*(valeurmax-valeurmin)+valeurmin;
			u[j]=(T)1;
		}
	}

	//printf("\n" );

	////affichons la matrice A
	//for (i=0;i<dim1;i++)
	//{
		//t=0;
		//for (j=0;j<dim2;j++)
		//{
			//printf("%f\t", A[i][j]);
			//printf("|%f\n",u[j] );
			//printf("t=%d\n",t);
		//}
	//}

	//printf("\n" );





//appel fonctions produit

	GEMV_2D(A,u,v,dim1,dim2,f_compteur);
//for(i=0;i<dim1;i++)
//  {printf("Avec GEMV v[%d]=%f\n",i,resultat[i]);} //on affiche le vecteur resultat
//printf("on passe a creuse_classique\n");
//printf("\n");

/**************liberation memoire***********************************************/
//liberation en memoire de A,u et v
	for(i=0;i<dim1;i++)
	{
		free(A[i]);
	}
	free(A);
	free(u);
	free(v);
/****************************************************************************/

return 0;
}
